package com.shenzhenai.it_hei_ma.a10threadsafe2;

/**
 * @author huangzehui
 * @date 2025/8/28 13:27 周四
 * @description
 */
public class MyRunnable implements Runnable {

    /**
     * 这里不需要使用 static，之前 Thread 的方式，是因为Thread会被创建三个，
     * 然后用 Runnable 的方式实现的线程，这个 Runnable 只会被创建一次
     */
    int ticket = 0; // 0~99

    @Override
    public void run() {
        // 1. 循环
        // 2. 同步代码块（同步方法）
        // 3. 判断共享数据是否到了末尾，如果到了末尾
        // 4. 判断共享数据是否到了末尾，如果没有到末尾

        // 1. 循环
        while (true) {
            // 2. 同步代码块（同步方法）
//            synchronized (MyRunnable.class) {
//                if (method()) break;
//            }
            if (method()) break;
        }
    }

    /**
     * 同步方法，锁用的是 this
     * @return
     */
    private synchronized boolean method() {
        // 3. 判断共享数据是否到了末尾，如果到了末尾
        if (ticket == 100) {
            // 到了末尾
            return true;
        } else {
            // 4. 判断共享数据是否到了末尾，如果没有到末尾
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            ticket++;
            System.out.println(Thread.currentThread().getName() + "在卖第" + ticket + "张票!!");
        }
        return false;
    }
}
